AWS IoT Coreポリシーを設定して、特定のデバイスのみデータのやり取りができるよう制限してみた

AWS IoT Coreポリシーを設定して、特定のデバイスのみデータのやり取りができるよう制限してみた

AWS IoT Coreポリシーを設定して、データをやり取りするデバイスを特定のものに制限します。例えば、証明書がアタッチされているデバイスのみ許可したり、デバイスと築堤のトピックを1対1で対応付けて制限付きで許可したりできます
Clock Icon2024.09.11

AWS IoT Coreとやりとりするデバイスを制限したい

おのやんです。

みなさん、AWS IoT Core(以下、IoT Core)とデータをやり取りするデバイスを特定のものに制限したいと思ったことはありませんか?私はあります。

IoT Coreでデバイスとメッセージをやりとりする場合、セキュリティの観点から、個々のデバイスとパブリッシュ(データ送信), サブスクライブ(データ受信)できるトピックはそれぞれ一意になるようにIoTポリシーを設定するの望ましいです。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-policies.html

このポリシーを設定する場合、IoTポリシーをポリシー変数で制御できます。今回は、既存のIoT ポリシーにこちらを設定する機会がありましたので、設定の手順など紹介していきたいと思います。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/thing-policy-variables.html

IoT ポリシーの設定

今回は、既存のIoT ポリシーを編集する形で設定していきます。ポリシー詳細画面にて、「アクティブなバージョンを編集」ボタンを押下します。

iot_core_policy_detail

次に、ポリシー編集画面にてJSONを入力していきます。JSONは以下のような内容を想定しています。


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Condition": {
        "Bool": {
          "iot:Connection.Thing.IsAttached": [
            "true"
          ]
        }
      },
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:client/${iot:Connection.Thing.ThingName}"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:topic/pub/${iot:Connection.Thing.ThingName}"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Receive",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:topic/sub/${iot:Connection.Thing.ThingName}"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Subscribe",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:topicfilter/sub/${iot:Connection.Thing.ThingName}"
    }
  ]
}

1つ目の記述は、証明書を発行してアタッチまで行っているデバイスのみ接続を許可するルールです。IoT Coreに登録された各デバイスを"arn:aws:iot:ap-northeast-1:<account_id>:client/${iot:Connection.Thing.ThingName}"で指定して、このうち証明書がアタッチされているデバイスのみAllowで許可しています。

    {
      "Condition": {
        "Bool": {
          "iot:Connection.Thing.IsAttached": [
            "true"
          ]
        }
      },
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:client/${iot:Connection.Thing.ThingName}"
    }

2つ目の記述は、メッセージのパブリッシュを指定したトピックへでのみ許可するルールです。こちらは、特定のトピックを"arn:aws:iot:ap-northeast-1:<account_id>:topic/pub/${iot:Connection.Thing.ThingName}"で指定しています。:topic/の後に、指定したいトピックを入力するのがポイントです。

    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:topic/pub/${iot:Connection.Thing.ThingName}"
    },

3つ目、4つ目の記述は、メッセージのサブスクライブとデバイスでの受信を指定したトピックからのみに許可するルールです。上記2つと同様に、"arn:aws:iot:ap-northeast-1:<account_id>:topicfilter/sub/${iot:Connection.Thing.ThingName}"で許可するトピックを指定しています。特にiot:Subscribeの場合は、:topicfilter/の後に指定したいトピックを入力するのがポイントです。

    {
      "Effect": "Allow",
      "Action": "iot:Receive",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:topic/sub/${iot:Connection.Thing.ThingName}"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Subscribe",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:topicfilter/sub/${iot:Connection.Thing.ThingName}"
    }

これらが入力できたら、「新しいバージョンとして保存」を押下します。

set_new_json

こちらのJSONは、現時点ではまだ本体のポリシーには適用されていません。さきほどのJSONは、この画面でいうバージョン「2」なので、ここを選択して「アクティブとして設定」を押下します。

set_new_policy_as_active

これで、既存のポリシーに新しいJSONを設定できました。

new_iot_core_policy

IoT Coreトピックで、特定のデバイスのみデータのやり取りを許可できる

以上、IoT CoreトピックでJSONを設定して、データのやり取りを行うデバイスを特定のものに制限する手順についてでした。

IoT Core でデバイスを管理する時など、非常によく使いますので、概要だけでも把握していただければと思います。では!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.